import numpy as np
import matplotlib.pyplot as plt

# 定义二次B样条 B_i^2(x) 的函数
def B_i2(x, t):
    if x < t[0] or x > t[3]:
        return 0
    elif t[0] <= x < t[1]:
        return (x - t[0])**2 / ((t[1] - t[0]) * (t[2] - t[0]))
    elif t[1] <= x < t[2]:
        return ((x - t[0]) * (t[2] - x)) / ((t[2] - t[0]) * (t[2] - t[1])) + \
               ((x - t[1]) * (t[3] - x)) / ((t[3] - t[1]) * (t[2] - t[1]))
    elif t[2] <= x <= t[3]:
        return (x - t[3])**2 / ((t[3] - t[2]) * (t[3] - t[1]))
    return 0

# 不同的 t 节点组，添加多个 t 来绘制多个二次B样条
t_sets = [
    np.array([0, 1, 2, 3]),         # 第一组 t
    np.array([1, 2, 3, 4]),         # 第二组 t
    np.array([2, 3, 4, 5]),     # 第三组 t
    np.array([3, 4, 5, 6])          # 第四组 t
]

# 生成 x 值用于绘图
x_vals = np.linspace(-0.5, 6.5, 500)

# 绘制每组 B 样条
plt.figure(figsize=(10, 8))

for t in t_sets:
    # 计算每个 x 值对应的 B_i^2(x)
    B_vals = np.array([B_i2(x, t) for x in x_vals])
    
    # 绘制每组 B 样条
    plt.plot(x_vals, B_vals, label=f'$B_i^2(x), t={t}$')

# 添加标签和标题
plt.title('$B_i^2(x)$')
plt.xlabel('x')
plt.ylabel('$B_i^2(x)$')
plt.legend(loc='upper right')
plt.grid(True)

# 显示图形
plt.savefig('b_splines_plot.png', dpi=300) 
plt.show()
